package com.xb.service;

import com.xb.common.Constant;
import com.xb.dao.UserDao;
import com.xb.entity.PageResult;
import com.xb.entity.User;
import com.xb.mapper.UserMapper;
import com.xb.util.EmailUtil;
import com.xb.util.RandomCodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.mail.MessagingException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private UserMapper userMapper;

    /**
     * 校验邮箱是否存在
     *
     * @param email 邮箱地址
     * @return true 存在; false 不存在
     */
    public boolean checkEmail(String email) {
        User user = userDao.findByEmail(email);
        if (user == null) return false;
        else return true;
    }

    /**
     * 校验用户名是否存在
     *
     * @param username 用户名
     * @return true 存在; false 不存在
     */
    public boolean checkUsername(String username) {
        User user = userDao.findByUsername(username);
        if (user == null) return false;
        else return true;
    }

    /**
     * 添加用户
     *
     * @param user 用户信息
     */
    public void save(User user) {
        user.setIsSecret("0");      // 默认不私密
        user.setLook(0L);           // 默认查看数0
        userDao.save(user);
    }

    /**
     * 发送邮件
     *
     * @param email 邮箱地址
     * @return 验证码
     */
    public String sendEmail(String email) {
        // 工具类生成验证码
        String code = RandomCodeUtil.getRandomCode(Constant.MAX_EMAIL_CODE);
        // 设置邮件信息
        String subject = "重置密码-小标交友";
        String content = "您的验证码是：  " + code + "  , 五分钟内有效。";
        // 工具类发送邮件(收件人，主题，内容，邮件编码)
        try {
            EmailUtil.send(email, subject, content, EmailUtil.UNICODE);
        } catch (MessagingException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return code;
    }

    /**
     * 通过邮箱地址查找用户
     *
     * @param email 邮箱地址
     * @return 用户信息
     */
    public User findByEmail(String email) {
        User user = userDao.findByEmail(email);
        return user;
    }

    /**
     * 更新用户密码
     *
     * @param user 用户信息（含新密码）
     */
    @Transactional
    public void updatePassword(User user) {
        userDao.updatePassword(user.getUsername(), user.getPassword());
    }

    /**
     * 通过用户名查找用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    public User findByUsername(String username) {
        User user = userDao.findByUsername(username);
        return user;
    }

    /**
     * 查询用户列表
     *
     * @param loginUser 登录用户
     * @param name      查询用户名
     * @param page      当前页
     * @return
     */
    public Page<User> findUser(User loginUser, String name, Integer page) {
        // 查询所有用户
        Page<User> userPage = userDao.findByUsernameLike("%" + name + "%", PageRequest.of(page - 1, PageResult.PAGE_SIZE));
        // 查询我的关注
        List<Long> myFocus = userMapper.findMyFocusId(loginUser.getId());
        Boolean flag = false;
        for (User user : userPage) {
            for (Long focus : myFocus) {
                if (user.getId() == focus) flag = true;
            }
            user.setFocus(flag);
            flag = false;
        }
        return userPage;
    }

    /**
     * 更改关注状态
     *
     * @param loginUserId 登录用户ID
     * @param focusId     操作对象ID
     * @param state       关注状态
     * @return 提示信息
     */
    public String updateMyFocus(Long loginUserId, Long focusId, Boolean state) {
        if (loginUserId == focusId) return "操作有误";
        else {
            List<Long> focus = userDao.findFocusByUserId(loginUserId);
            if (state == true) {
                // 用户关注
                for (Long id : focus) {
                    if (id == focusId) return "不可重复关注";
                }
                userDao.insertFocus(loginUserId, focusId);
                return "关注成功";
            } else {
                // 用户取关
                for (Long id : focus) {
                    if (id == focusId) {
                        userDao.deleteFocus(loginUserId, focusId);
                        return "取关成功";
                    }
                }
                return "已取关";
            }
        }
    }

    public void updatePicUrl(Long id, String url) {
        userDao.updatePicUrl(id, url);
    }

    /**
     * 查询用户信息是否私密
     * @param userId
     * @return
     */
    public String findUserIsSecret(Long userId) {
        return userDao.findByIsSecret(userId);
    }

    public User findById(Long userId) {
        return userDao.findById(userId).get();
    }

    /**
     * 即时更新粉丝数
     * @param userId 用户ID
     * @return 粉丝数
     */
    public Integer findFocus(Long userId) {
        return userMapper.findMyFocusId(userId).size();
    }


    public void updateLook(User user) {
        userDao.updateLook(user.getId(), user.getLook());
    }


    public Page<User> findMyFocus(Long userId,Integer page) {
        return userDao.findMyFocus(userId, PageRequest.of(page - 1, PageResult.PAGE_SIZE));
    }

    public List<User> findByDeptId(Long deptId) {
        return userDao.findByDeptId(deptId);
    }

    public void updateLoginTime(Long id) {


    }

    public User findByWxOpenid(String openid) {
        return userDao.findByWxOpenid(openid);
    }
}
